﻿using System;
using System.Drawing;
using System.Windows.Forms;
using SpriteAnimator.Classes;

namespace SpriteAnimator
{
    /// <summary>
    /// Fenêtre de gestion des options générales de l'application
    /// </summary>
    public partial class frmOptions : Form
    {
        #region Variables membres

        private bool m_bToSave;

        #endregion

        #region Constructeur

        /// <summary>
        /// Constructeur de la form
        /// </summary>
        public frmOptions()
        {
            InitializeComponent();

            // *** Initialisation ***

            this.LoadSettings();
            this.DialogResult = DialogResult.Cancel;
            this.m_bToSave = false;
        }

        #endregion

        #region Evnéments de l'IHM

        /// <summary>
        /// Change sur le statut d'une checkbox
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void chkPreview_CheckedChanged(object sender, EventArgs e)
        {
            this.m_bToSave = true;
        }

        /// <summary>
        /// Change sur le statut d'une checkbox
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void chkRectangle_CheckedChanged(object sender, EventArgs e)
        {
            this.m_bToSave = true;
        }

        /// <summary>
        /// Change sur la modification de la couleur
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void cmdCouleur_Click(object sender, EventArgs e)
        {
            this.dlgColor.Color = this.lblCouleur.BackColor;

            if ( this.dlgColor.ShowDialog(this) == DialogResult.OK )
            {
                this.lblCouleur.BackColor = this.dlgColor.Color;
                this.m_bToSave = true;
            }
        }

        /// <summary>
        /// Réinitialise les paramètres
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void cmdDefaut_Click(object sender, EventArgs e)
        {
            this.lblCouleur.BackColor = Color.CornflowerBlue;
            this.chkPreview.Checked = true;
            this.chkRectangle.Checked = true;
            this.m_bToSave = true;
        }

        /// <summary>
        /// Annule les modifications
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void cmdAnnuler_Click(object sender, EventArgs e)
        {
            this.m_bToSave = false;
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        /// <summary>
        /// Valide les modifications
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void cmdValider_Click(object sender, EventArgs e)
        {
            this.SaveSettings();
            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        /// <summary>
        /// Demande de confirmation pour sortir
        /// </summary>
        /// <param name="sender">Source de l'appel</param>
        /// <param name="e">Argument de l'appel</param>
        private void frmOptions_FormClosing(object sender, FormClosingEventArgs e)
        {
            if ( this.m_bToSave )
            {
                DialogResult oResult = MessageBox.Show(this, "Des modifications ont été apportés, voulez-vous les enregistrer ?", "Options", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);

                if ( oResult == DialogResult.Cancel )
                    e.Cancel = true;
                else if ( oResult == DialogResult.Yes )
                    this.SaveSettings();
            }
        }

        #endregion

        #region Fonctions privées

        /// <summary>
        /// Charge le paramétrage
        /// </summary>
        private void LoadSettings()
        {
            this.chkPreview.Checked = Utils.GetRegistryValue("SpritePreview", "1", Utils.REGISTRY_KEY).Equals("1");
            this.chkRectangle.Checked = Utils.GetRegistryValue("SpriteRectangle", "1", Utils.REGISTRY_KEY).Equals("1");
            this.lblCouleur.BackColor = Color.FromArgb(Convert.ToInt32(Utils.GetRegistryValue("BackColor", Color.CornflowerBlue.ToArgb().ToString(), Utils.REGISTRY_KEY)));
        }

        /// <summary>
        /// Sauvegarde les paramètres
        /// </summary>
        private void SaveSettings()
        {
            Utils.SetRegistryValue("SpritePreview", this.chkPreview.Checked ? "1" : "0", Utils.REGISTRY_KEY);
            Utils.SetRegistryValue("SpriteRectangle", this.chkRectangle.Checked ? "1" : "0", Utils.REGISTRY_KEY);
            Utils.SetRegistryValue("BackColor", this.lblCouleur.BackColor.ToArgb().ToString(), Utils.REGISTRY_KEY);

            this.m_bToSave = false;
        }

        #endregion
    }
}
